package com.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author haoya_Coding_one
 * @version 1.0
 * @create 2018/12/20 15:06
 * @description TODO
 */

//　从Spring3.0，@Configuration用于定义配置类，可替换xml配置文件，被注解的类内部包含有一个或多个被@Bean注解的方法，
// 这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描，
// 并用于构建bean定义，初始化Spring容器。
//注意：@Configuration注解的配置类有如下要求：
//@Configuration不可以是final类型；
//@Configuration不可以是匿名类；
//嵌套的configuration必须是静态类。
@Configuration
//@EnableConfigurationProperties注解的作用是：使使用 @ConfigurationProperties 注解的类生效
//如果一个配置类只配置@ConfigurationProperties注解，
// 而没有使用@Component，那么在IOC容器中是获取不到properties 配置文件转化的bean。
// 说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
//测试证明：
//@ConfigurationProperties 与 @EnableConfigurationProperties 的关系。
//@EnableConfigurationProperties 文档中解释：
//当@EnableConfigurationProperties注解应用到你的@Configuration时，
// 任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。
// 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用
@EnableConfigurationProperties(RedisConfig.class)
//Spring Boot通过@ConditionalOnClass 来控制Configuration是否生效
//例子：
//判断条件取决于，spring 里是否已经 有了 SpringSecurityCoreVersion 这个类。
//@ConditionalOnClass(SpringSecurityCoreVersion.class)
@ConditionalOnClass(JedisPool.class)
public class RedisPool {
    public static final String jedisPoolBeanName="jedisPool";
    @Autowired
    RedisConfig redisConfig;

    @Bean(name = RedisPool.jedisPoolBeanName)   //交给spring容器管理了
    public JedisPool jedisPool(){
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
        jedisPoolConfig.setTestOnBorrow(redisConfig.getTestOnBorrow());
        jedisPoolConfig.setMaxTotal(redisConfig.getMaxTotal());
        jedisPoolConfig.setMaxWaitMillis(redisConfig.getMaxWaitMillis());
        return new JedisPool(jedisPoolConfig, redisConfig.getHost(), redisConfig.getPort(), redisConfig.getTimeOut(), redisConfig.getPassword());
    }
}
